package com.zs.propertymanage.mapper;

import com.zs.propertymanage.dataObj.GeneralExtra;
import com.zs.propertymanage.dataObj.entity.Employee;
import com.zs.propertymanage.dataObj.entity.WorkOrder;
import com.zs.propertymanage.dataObj.workorderExtra.WorkOrderCategory;
import org.apache.ibatis.annotations.Mapper;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

@Mapper
public interface WorkOrderMapper {

    /**
     * 根据条件分页获取所有工单
     *
     * @param search   搜索条件
     * @param start    起始位置
     * @param pageSize 页大小
     * @return 工单列表
     */
    List<WorkOrder> getAllWorkOrder(String search, Integer start, Integer pageSize);

    /**
     * 根据条件分页获取所有工单数量
     *
     * @param search 搜索条件
     * @return 总数量
     */
    Integer getAllWorkOrderCount(String search);

    /**
     * 获取所有分类
     *
     * @return 分类列表
     */
    List<WorkOrderCategory> getAllCategory();

    /**
     * 添加分类
     *
     * @param categoryName 分类名称
     * @return 添加的分类id
     */
    Integer addCategory(String categoryName);

    /**
     * 删除分类
     *
     * @param id 分类id
     * @return 删除成功返回1，否则返回0
     */
    Integer deleteCategory(Integer id);

    /**
     * 获取所有状态
     *
     * @return 状态列表
     */
    List<GeneralExtra> getAllWorkOrderStatus();

    /**
     * 添加状态
     *
     * @param statusName 状态名称
     * @return 添加的状态id
     */
    Integer addWorkOrderStatus(String statusName);

    /**
     * 删除状态
     *
     * @param id 状态id
     * @return 删除成功返回1，否则返回0
     */
    Integer deleteWorkOrderStatus(Integer id);

    /**
     * 获取租户的工单数量
     *
     * @param tenantId 租户id
     * @return 租户的工单数量
     */
    Integer getCountOfTenant(String tenantId);

    /**
     * 获取租户的某个分类下的工单数量
     *
     * @param tenantId   租户id
     * @param categoryId 分类id
     * @return 租户的某个分类下的工单数量
     */
    Integer getCountOfTenantByCategory(String tenantId, Integer categoryId);

    /**
     * 获取租户的某个状态下的工单数量
     *
     * @param tenantId       租户id
     * @param completeStatus 状态id
     * @return 租户的某个状态下的工单数量
     */
    Integer getCountOfTenantByCompleteStatus(String tenantId, Integer completeStatus);

    /**
     * 获取某个租户的工单
     *
     * @param tenantId 租户id
     * @param search   搜索条件
     * @param start    起始位置
     * @param pageSize 页大小
     * @return 工单列表
     */
    List<WorkOrder> getWorkOrderByTenantId(String tenantId, String search, Integer start, Integer pageSize);

    /**
     * 获取某个租户的工单数量
     *
     * @param tenantId 租户id
     * @param search   搜索条件
     * @return 工单数量
     */
    Integer getWorkOrderCountByTenantId(String tenantId, String search);

    /**
     * 修改工单关闭状态
     *
     * @param workOrderId 工单id
     * @param closeStatus 关闭状态
     * @return 修改成功返回1，否则返回0
     */
    Integer changeCloseStatus(String workOrderId, Integer closeStatus);

    /**
     * 获取工单的关闭状态
     *
     * @param workOrderId 工单id
     * @return 工单的关闭状态
     */
    Integer getCloseStatus(String workOrderId);

    /**
     * 添加工单
     *
     * @param workOrder 工单对象
     * @return 添加的工单id
     */
    Integer addWorkOrder(WorkOrder workOrder);

    /**
     * 设置分类流程
     *
     * @param categoryId 分类id
     * @param flowStr    流程字符串
     * @return 设置成功返回1，否则返回0
     */
    Integer setCategoryFlow(Integer categoryId, String flowStr);

    /**
     * 根据分类id获取分类对象
     *
     * @param workOrderCategoryId 分类id
     * @return 分类对象
     */
    WorkOrderCategory getCategoryById(Integer workOrderCategoryId);

    /**
     * 根据状态id获取工作状态对象
     *
     * @param statusId 状态id
     * @return 工作状态对象
     */
    GeneralExtra getWorkOrderStatusById(Integer statusId);

    /**
     * 获取未被接收的工单
     *
     * @return 未被接收的工单
     */
    List<WorkOrder> getUnreceivedWorkOrder();

    /**
     * 根据工单ID获取工单
     *
     * @param workOrderId 工单ID
     * @return 工单对象
     */
    WorkOrder getWorkOrderById(String workOrderId);

    /**
     * 处理工单
     *
     * @param workOrder 工单对象
     * @return 处理结果，返回Integer类型
     */
    Integer handleWorkOrder(WorkOrder workOrder);

    /**
     * 获取已接收的工单
     *
     * @param employeeId 员工ID
     * @param search     搜索条件
     * @param start      开始位置
     * @param pageSize   分页大小
     * @return 工单列表
     */
    List<WorkOrder> getReceivedWorkOrder(String employeeId, String search, Integer start, Integer pageSize);

    /**
     * 更新工单
     *
     * @param workOrder 工单对象
     * @return 更新结果，返回Integer类型
     */
    Integer updateWorkOrder(WorkOrder workOrder);

    /**
     * 获取员工的某个完成状态下的工单数量
     *
     * @param employeeId     员工ID
     * @param completeStatus 状态id
     * @return 员工的某个状态下的工单数量
     */
    Integer getCountOfEmployeeByCompleteStatus(String employeeId, Integer completeStatus);

    /**
     * 设置工单分类的职责人员
     *
     * @param dutyList   职责人员表的对象列表
     * @param categoryId 工单分类id
     * @return 处理结果
     */
    int setCategoryDuty(Integer categoryId, List<Map<String, String>> dutyList);

    /**
     * 查询员工有职责的工单分类
     *
     * @param employeeId 员工ID(用逗号包围，避免错查)
     * @return 工单分类列表
     */
    List<WorkOrderCategory> getDutyCategory(String employeeId);

    /**
     * 根据分类id和组织id列表获取未被接收的工单
     *
     * @param categoryId 分类id
     * @param orgIdList  组织id列表
     * @return 未接收的工单列表
     */
    List<WorkOrder> getUnreceivedWorkOrderByCategoryIdAndOrgId(Integer categoryId, List<Integer> orgIdList);

    // 获取分类的职责人员 list(id,name)
    List<Map<String, String>> getCategoryDuty(Integer categoryId);

    // 获取分类的职责人员 object(employee)
    List<Employee> getCategoryDutyObj(Integer categoryId);

    // 删除分类的职责人员
    int deleteCategoryDuty(Integer categoryId);

    Integer getTotal();

    List<WorkOrder> getWithDateTimeRange(LocalDateTime start, LocalDateTime end);
}